const os = require('os');
const path = require('path');

/**
 * 操作系统工具类
 * 提供跨平台的操作系统相关功能
 */
class OSUtils {
  /**
   * 获取当前操作系统类型
   * @returns {string} 'windows' | 'linux' | 'darwin' | 'other'
   */
  static getPlatform() {
    const platform = os.platform();
    switch (platform) {
      case 'win32':
        return 'windows';
      case 'linux':
        return 'linux';
      case 'darwin':
        return 'macos';
      default:
        return 'other';
    }
  }

  /**
   * 检查是否为Windows系统
   * @returns {boolean}
   */
  static isWindows() {
    return os.platform() === 'win32';
  }

  /**
   * 检查是否为Unix系统（Linux/macOS）
   * @returns {boolean}
   */
  static isUnix() {
    return !this.isWindows();
  }

  /**
   * 获取系统临时目录
   * @returns {string}
   */
  static getTempDir() {
    return os.tmpdir();
  }

  /**
   * 获取用户主目录
   * @returns {string}
   */
  static getHomeDir() {
    return os.homedir();
  }

  /**
   * 规范化路径分隔符
   * @param {string} filePath 
   * @returns {string}
   */
  static normalizePath(filePath) {
    return path.normalize(filePath);
  }

  /**
   * 获取可执行文件扩展名
   * @returns {string}
   */
  static getExecutableExtension() {
    return this.isWindows() ? '.exe' : '';
  }

  /**
   * 获取脚本文件扩展名
   * @returns {string}
   */
  static getScriptExtension() {
    return this.isWindows() ? '.bat' : '.sh';
  }

  /**
   * 获取环境变量路径分隔符
   * @returns {string}
   */
  static getPathSeparator() {
    return this.isWindows() ? ';' : ':';
  }

  /**
   * 检查文件权限（仅Unix系统）
   * @param {string} filePath 
   * @param {number} expectedMode 
   * @returns {Promise<{valid: boolean, currentMode?: string, message: string}>}
   */
  static async checkFilePermissions(filePath, expectedMode = 0o600) {
    if (this.isWindows()) {
      return { valid: true, message: 'Windows系统不检查文件权限' };
    }

    try {
      const fs = require('fs-extra');
      const stats = await fs.stat(filePath);
      const currentMode = stats.mode & parseInt('777', 8);
      
      if (currentMode !== expectedMode) {
        return {
          valid: false,
          currentMode: currentMode.toString(8),
          message: `文件权限不正确，当前: ${currentMode.toString(8)}, 期望: ${expectedMode.toString(8)}`
        };
      }
      
      return { valid: true, message: '文件权限正确' };
    } catch (error) {
      return { valid: false, message: `检查文件权限失败: ${error.message}` };
    }
  }

  /**
   * 设置文件权限（仅Unix系统）
   * @param {string} filePath 
   * @param {number} mode 
   * @returns {Promise<boolean>}
   */
  static async setFilePermissions(filePath, mode = 0o600) {
    if (this.isWindows()) {
      return true; // Windows系统不需要设置权限
    }

    try {
      const fs = require('fs-extra');
      await fs.chmod(filePath, mode);
      return true;
    } catch (error) {
      console.error(`设置文件权限失败: ${error.message}`);
      return false;
    }
  }

  /**
   * 获取系统信息
   * @returns {object}
   */
  static getSystemInfo() {
    return {
      platform: this.getPlatform(),
      arch: os.arch(),
      nodeVersion: process.version,
      release: os.release(),
      hostname: os.hostname(),
      cpus: os.cpus().length,
      totalMemory: os.totalmem(),
      freeMemory: os.freemem(),
      uptime: os.uptime()
    };
  }

  /**
   * 构建跨平台的命令
   * @param {string} command 基础命令
   * @param {string[]} args 参数数组
   * @returns {string}
   */
  static buildCommand(command, args = []) {
    // 在Windows上，某些命令可能需要通过cmd执行
    if (this.isWindows()) {
      // 检查是否为内置命令
      const builtinCommands = ['dir', 'copy', 'move', 'del', 'type', 'echo'];
      if (builtinCommands.includes(command.toLowerCase())) {
        return `cmd /c ${command} ${args.join(' ')}`;
      }
    }
    
    return `${command} ${args.join(' ')}`;
  }

  /**
   * 获取Shell命令前缀
   * @returns {string}
   */
  static getShellPrefix() {
    return this.isWindows() ? 'cmd /c' : 'sh -c';
  }
}

module.exports = OSUtils;